iT邦幫忙

2022 iThome 鐵人賽

DAY 9
0
AI & Data

【30天之新手學習筆記】PyTorch系列 第 9

Day 09 - PyTorch自動計算梯度(autograd)

  • 分享至 

  • xImage
  •  

梯度(gradient)的這個概念對我這個初學來說並不是很容易就能理解,在物理上梯度可以理解成在做一個空間中純量場的數學運算,用來了解純量場隨空間的變化,而數學中我們從梯度下降演算法中可以幫助我們找到函數的極小值.之所以會將梯度下降演算法用在機器學習與深度學習的相關利用中求函數的極小值,主要是因為它能夠透過找近似解的方式去逼近極值.說到找極值的問題,相信不少人都會想到數學上可以利用微分的方式去找,但實際應用與微積分的考試當然不同不會那麼剛好可以找到唯一解的.

Autograd

前幾天我主要是對張量做了很概略的介紹,PyTorch中的張量會記住自己是如何生成的,即產生張量的運算以及母張量為何,並且提供運算對其輸入變數的連鎖導數.也就是我們不必寫出完整的微分式,無論模型的複雜度多高,PyTorch都能自動的幫我們計算參數的梯度.

  1. 先定義一個變數(variable)
In:
import torch
from torch.autograd import Variable
tensor = torch.FloatTensor([[1,2,3],[4,5,6]])
variable = Variable(tensor, requires_grad=True)

Out:
tensor([[1., 2., 3.],
        [4., 5., 6.]])
tensor([[1., 2., 3.],
        [4., 5., 6.]], requires_grad=True)

requires_grad 這個設定主要是參不參與反向傳播.

  1. 對比張量與變數計算的差異
In:
t_out = torch.mean(tensor*tensor*tensor)  # x^3
v_out = torch.mean(variable*variable*variable)  # x^3
print(t_out)
print(v_out)

Out:
tensor(73.5000)
tensor(73.5000, grad_fn=<MeanBackward0>)

到這裡為止的tensor與variable看不出有何不同.但事實上變數計算時,PyTorch中autograd的底層採用了計算圖,計算圖是用於紀錄運算子與變數之間的關係,一般用矩形表示運算子,橢圓形表示變數.
https://ithelp.ithome.com.tw/upload/images/20220923/20152671Lz2iLXaMkO.jpg
圖片來源:https://www.qikegu.com/docs/4201

  1. v_out = torch.mean(variable * variable * variable) 就是在計算圖中添加的一個計算步驟,計算誤差反向傳播,以下用程式碼做舉例:
In:
v_out.backward()
print(variable.grad)

Out:
tensor([[ 0.5000,  2.0000,  4.5000],
        [ 8.0000, 12.5000, 18.0000]])

參考資料:


上一篇
Day 08 - 將張量轉移至GPU
下一篇
Day 10 - 激勵函數(Activation Function)介紹
系列文
【30天之新手學習筆記】PyTorch30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言